package cn.monkey.transport.core;

import reactor.core.publisher.Mono;

/**
 * 数据交换对象
 */
public interface Exchange {
    String KEY = "EXCHANGE";

    String id();

    /**
     * 获取当前数据交互的上下文
     *
     * @see ExchangeContext
     */
    ExchangeContext context();

    default <T> T setAttribute(String key, T val) {
        return this.context().setAttribute(key, val);
    }

    default <T> T getAttribute(String key) {
        return this.context().getAttribute(key);
    }

    /**
     * 读数据的对象
     *
     * @return {@link Inbound}
     */
    Inbound inbound();

    /**
     * 写数据的对象
     *
     * @return {@link Outbound}
     */
    Outbound outbound();

    /**
     * 销毁当前对象，
     * 除close之外，还可以销毁其他资源，如：上下文中的资源
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    default Mono<Void> destroy() {
        return this.close();
    }

    /**
     * 关闭当前对象，
     * 如 Inbound 跟 Outbound中的链接
     *
     * @return 关闭结果
     * 如果执行失败，则通过{@link Mono#error} 取获取错误信息
     */
    Mono<Void> close();

    /**
     * 判断当前对象是否激活
     */
    boolean isActive();

    /**
     * @see Outbound#writeAndFlush(Object)
     */
    default Mono<Void> write(Object o) {
        return this.outbound().write(o);
    }

    /**
     * @see Outbound#flush()
     */
    default Mono<Void> flush() {
        return this.outbound().flush();
    }

    /**
     * @see Outbound#writeAndFlush
     */
    default Mono<Void> writeAndFlush(Object o) {
        return this.outbound().writeAndFlush(o);
    }

    /**
     * 将当前对象绑定到某个上下文
     */
    Exchange bind();
}
